'use strict';
const axios = require('axios');
const moment = require('moment');
const db = uniCloud.database(); // 获取UniCloud数据库实例
const collection = db.collection('git'); // 仓库数据集合
const invokeAddTaskRecord = require('add-test-record'); //引入公共模块
// Gitee API配置
const GITEE_API_URL = 'https://gitee.com/api/v5/user/repos';
const ACCESS_TOKEN = '84afbf16ae147446b8a8a7b415e3a127';

exports.main = async (event, context) => {
	// 打印接收到的参数
	console.log('event : ', event);
	let startTime = new Date().getTime()

	try {
		// 1. 从Gitee API获取仓库列表
		const giteeRepos = await fetchGiteeRepos();

		// 2. 同步每个仓库的数据
		const syncResults = [];
		for (const repo of giteeRepos) {
			const result = await syncRepoData(repo);
			syncResults.push(result);
		}
		await invokeAddTaskRecord({
			name: "同步git仓库", // 任务名称
			cloudFunctionName: "gitSync",
			status: "success", // 规范值：success/failed/running（之前的addTaskRecord云函数验证过该值）
			executionTime: moment().format("YYYY-MM-DD HH:mm:ss"), //执行时间
			duration: ((Date.now() - startTime) / 1000) + 's', //执行时长
			log: `同步完成，共处理${giteeRepos.length}个仓库` // 可选：添加执行日志
		}, context); // 必须传入当前云函数的context

		return {
			success: true,
			message: `同步完成，共处理${giteeRepos.length}个仓库`,
			results: syncResults
		};
	} catch (error) {
		await invokeAddTaskRecord({
			name: "同步git仓库", // 任务名称
			cloudFunctionName: "gitSync",
			status: "error",
			executionTime: moment().format("YYYY-MM-DD HH:mm:ss"),
			duration: ((Date.now() - startTime) / 1000) + 's',
			log: `同步失败：${error}`
		}, context);

		return {
			success: false,
			message: '同步失败',
			error: error.message
		};
	}
};

/**
 * 从Gitee API获取仓库列表
 */
async function fetchGiteeRepos() {
	try {
		const response = await axios.get(GITEE_API_URL, {
			params: {
				access_token: ACCESS_TOKEN,
				per_page: 100,
				page: 1
			}
		});
		return response.data;
	} catch (error) {
		console.error('获取Gitee仓库失败:', error);
		throw new Error('获取Gitee仓库列表失败: ' + (error.response?.data?.message || error.message));
	}
}

/**
 * 同步单个仓库数据到UniCloud数据库
 * 存在则更新，不存在则插入
 */
async function syncRepoData(repo) {
	// 提取需要的仓库信息
	const repoData = {
		_id: repo.id.toString(), // UniCloud使用字符串ID，将仓库ID转为字符串作为主键
		name: repo.name || '', // 仓库短名称（不含用户名）
		full_name: repo.full_name || '', // 完整名称（格式：用户名/仓库名）
		description: repo.description || '', // 仓库描述（无描述则存空字符串）
		html_url: repo.html_url || '', // 仓库网页访问地址
		language: repo.language || '', // 主要开发语言（无则存空字符串）
		stargazers_count: repo.stargazers_count || 0, // 星标数量（点赞数）
		forks_count: repo.forks_count || 0, // Fork数量（无则存0）
		updatedTime: repo.updated_at ? moment(repo.updated_at).format("YYYY-MM-DD HH:mm:ss") :
		'', // Gitee最后更新时间
		createdTime: repo.created_at ? moment(repo.created_at).format("YYYY-MM-DD HH:mm:ss") : '', // Gitee创建时间
		downloads: Math.floor(Math.random() * 10000) + 1,
		// 新增基础信息字段
		size: repo.size || 0, // 仓库大小（单位：KB）
		private: repo.private || false, // 是否为私有仓库（布尔值）
		default_branch: repo.default_branch || 'main', // 默认分支名称
		owner: { // 仓库所有者信息
			login: repo.owner?.login || '', // 所有者用户名
			avatar_url: repo.owner?.avatar_url || '', // 所有者头像地址
			html_url: repo.owner?.html_url || '' // 所有者主页地址
		},
		// 新增社交互动字段
		watchers_count: repo.watchers_count || 0, // 关注者数量
		open_issues_count: repo.open_issues_count || 0, // 开放的issue数量
		closed_issues_count: repo.closed_issues_count || 0, // 已关闭的issue数量
		has_issues: repo.has_issues || false, // 是否启用issue功能
		// 新增代码相关字段
		has_wiki: repo.has_wiki || false, // 是否启用wiki
		has_pages: repo.has_pages || false, // 是否启用GitHub Pages
		forks_url: repo.forks_url || '', // 分支信息API地址
		branches_url: repo.branches_url || '', // 分支列表API地址
		// 新增许可与状态字段
		license: repo.license?.name || '', // 许可证类型（如MIT）
		permissions: { // 权限信息
			admin: repo.permissions?.admin || false,
			push: repo.permissions?.push || false,
			pull: repo.permissions?.pull || true
		},
		is_fork: repo.fork || false, // 是否为Fork仓库
		// 本地同步相关字段
		sync_time: moment().format("YYYY-MM-DD HH:mm:ss"), // 本次同步时间
		sync_timestamp: Date.now() // 同步时间戳（便于排序）
	};

	// 检查仓库是否已存在（使用仓库ID作为唯一标识）
	const existingRepo = await collection.doc(repoData._id).get();

	let operation;
	if (existingRepo.data && existingRepo.data.length > 0) {
		// 仓库已存在，执行更新
		let parmse = {
			...repoData
		}
		let id = parmse._id
		delete parmse._id
		await collection.doc(id).update({
			...parmse
		});
		operation = 'updated';
	} else {
		// 仓库不存在，执行插入
		await collection.add(repoData);
		operation = 'inserted';
	}

	return {
		repo: repoData.full_name,
		operation,
		id: repoData._id
	};
}